package br.com.ericogr.hanoi.iu;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import br.com.ericogr.hanoi.R;
import br.com.ericogr.hanoi.database.Pontuacao;
import br.com.ericogr.hanoi.database.dao.PontuacaoDao;
import br.com.ericogr.hanoi.database.dao.PontuacaoDaoImpl;
import br.com.ericogr.hanoi.entidade.Entidade;
import br.com.ericogr.hanoi.entidade.EntidadeFundo;
import br.com.ericogr.hanoi.entidade.EntidadeHanoi;
import br.com.ericogr.hanoi.entidade.JogoListener;

public class AtividadeMovePrato extends Activity {
    private static final String PARAMETRO_ENTIDADES_HANOI = "PARAMETRO_ENTIDADES_HANOI";
    private static final String PARAMETRO_JOGO_FINALIZADO = "PARAMETRO_JOGO_FINALIZADO";
    
    private HanoiView mHanoiView;
    private PontuacaoDao mPontuacaoDao;
    private int mQuantidadeDePratos;
    private boolean mJogoFinalizado;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.move_pratos);
        
        mQuantidadeDePratos = Integer.parseInt(getIntent().getStringExtra(AtividadeConfiguracao.QUANTIDADE_DE_PRATOS));
        mHanoiView = (HanoiView)findViewById(R.id.viewTelaDoJogo);
        mPontuacaoDao = new PontuacaoDaoImpl(this);
        
        iniciarTelaDoJogo(savedInstanceState);
    }
    
    @SuppressWarnings("unchecked")
    private void iniciarTelaDoJogo(Bundle savedInstanceState) {
        List<Entidade> entidades;
        
        if (savedInstanceState != null) {
            entidades = (List<Entidade>)savedInstanceState.getSerializable(PARAMETRO_ENTIDADES_HANOI);
            setJogoListener(entidades);
            mJogoFinalizado = savedInstanceState.getBoolean(PARAMETRO_JOGO_FINALIZADO);
        }
        else {
            entidades = getEntidades();
            mJogoFinalizado = false;
        }
        
        mHanoiView.setEntidades(entidades);
    }

    @Override
    public void onBackPressed() {
        if (!mJogoFinalizado) {
            new AlertDialog.Builder(this)
                .setMessage(R.string.confirma_finalizar_partida)
                .setTitle(R.string.app_name)
                .setCancelable(true)
                .setPositiveButton(
                        android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                AtividadeMovePrato.super.onBackPressed();
                            }
                        })
                .setNeutralButton(
                        android.R.string.cancel, null)
                .show();
        }
        else {
            super.onBackPressed();
        }
    }
    
    @Override
    protected void onPause() {
        super.onPause();
    }
    
    protected void onSaveInstanceState (Bundle outState) {
        outState.putSerializable(PARAMETRO_ENTIDADES_HANOI, serializarEntidadesView());
        outState.putBoolean(PARAMETRO_JOGO_FINALIZADO, mJogoFinalizado);
    }

    private Serializable serializarEntidadesView() {
        List<Entidade> entidades = mHanoiView.getEntidades();
        
        return (Serializable)entidades;
    }

    @Override
    protected void onResume() {
        super.onResume();
    }
    
    private void gravarPontuacao(Pontuacao pontuacaoNova) {
        Pontuacao pontuacao = mPontuacaoDao.getPontuacaPorPrato(pontuacaoNova.getPratos());
        
        if (pontuacao == null) {
            pontuacao = new Pontuacao(pontuacaoNova.getPratos(), Integer.MAX_VALUE, Integer.MAX_VALUE);
        }
        
        if (pontuacaoNova.getMovimentos() < pontuacao.getMovimentos() ||
           (pontuacaoNova.getMovimentos() == pontuacao.getMovimentos() && pontuacaoNova.getTempo() < pontuacao.getTempo())) 
        {
            pontuacao.setMovimentos(pontuacaoNova.getMovimentos());
            pontuacao.setTempo(pontuacaoNova.getTempo());
            pontuacao.setData(new Date());
            
            mPontuacaoDao.inserirAtualizar(pontuacao);
        }
    }
    
    private List<Entidade> getEntidades() {
        List<Entidade> entidades = new ArrayList<Entidade>();
        
        Entidade entidadeFundo = new EntidadeFundo();
        Entidade entidadeHanoi = new EntidadeHanoi(mQuantidadeDePratos);
        
        entidades.add(entidadeFundo);
        entidades.add(entidadeHanoi);
        
        setJogoListener(entidades);
        
        return entidades;
    }
    
    private void setJogoListener(List<Entidade> entidades) {
        for (Entidade entidade : entidades) { 
            entidade.setJogoListener(new JogoListener() {
                @Override
                public void fimDeJogo(Pontuacao pontuacao) {
                    mJogoFinalizado = true;
                    gravarPontuacao(pontuacao);
                }
            });
        }
    }

}
